#include "SerialInator.h"
#include <string.h>


SerialInator::SerialInator(){
	this->_posActual =0;
}


SerialInator::~SerialInator(){
	this->_posActual =0;
}


// Al colocar la posicion actual del buffer que se esta procesando en cero
// se puede utilizar las otras operaciones (serializar/des-serializar)
void SerialInator::reset(){
	this->_posActual =0;
}


// Devuelve un puntero a la posicion actual que se esta procesando del buffer señalado
char* SerialInator::getPtroActual(char* dataBuffer){
	return dataBuffer + this->_posActual;
}


void SerialInator::serializar(char* &arrBytes, char c){
	arrBytes[this->_posActual] = c;
	this->_posActual++;
}


void SerialInator::serializar(char* &arrBytes, unsigned long int valor){
	// Copia los bytes
	memcpy(arrBytes, &valor, sizeof(unsigned long int));
	this->_posActual += sizeof(unsigned long int);
}


// Para serializar una cadena primero guarda su tamaño en bytes
void SerialInator::serializar(char* &arrBytes, std::string cadena){

	// Serializa la longitud de la cadena
	serializar(arrBytes, static_cast<unsigned long int>(cadena.size()));

	// Copia los caracteres al buffer
	char* ptrCadena = &arrBytes[this->_posActual];
	cadena.copy(ptrCadena, cadena.size());
	this->_posActual += cadena.size();
}

//---------------------------------------------------------

void SerialInator::desSerializar(char* arrBytes, char &c){
	c = arrBytes[this->_posActual++];
}


void SerialInator::desSerializar(char* arrBytes, unsigned long &valor){
	memcpy(&valor, arrBytes, sizeof(unsigned long));
	this->_posActual += sizeof(unsigned long);
}


void SerialInator::desSerializar(char* arrBytes, std::string &cadena){
	// Primero extrae la longitud de la cadena
	unsigned long int tamCadena;
	desSerializar(arrBytes, tamCadena);

	// Extrae la cadena en si
	cadena.assign(&arrBytes[this->_posActual], tamCadena);
	this->_posActual += tamCadena;
}

